package com.zlsy.thread.synchronizedlearing;

/**
 * @author zhouliang
 * @date 2020/03/02
 **/
public class SynchronizedObjectLock implements Runnable {

    static SynchronizedObjectLock synchronizedObjectLock = new SynchronizedObjectLock();

    final Object lock1 = new Object();
    final Object lock2 = new Object();

    @Override
    public void run() {
       /*
       //锁对象为当前实例，多个线程执行这个实例的改方法的时候，在同一时刻只允许一个线程进入，
       //只到该执行线程执行完毕，释放锁，才允许下一个获得锁的线程进入
       synchronized (this) {
            sameMethod();
        }*/

        //自定义锁对象，在需要不同的代码块相互配合的时候
        synchronized (lock1) {
            sameMethod();
        }
        synchronized (lock2) {
            sameMethod();
        }

    }

    private void sameMethod() {
        System.out.println("我是对象锁的代码块的形式，我叫:" + Thread.currentThread().getName());
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "结束运行。");
    }

    public static void main(String[] args) {
        Thread thread = new Thread(synchronizedObjectLock);
        Thread thread1 = new Thread(synchronizedObjectLock);
        thread.start();
        thread1.start();
        //只要两个线程都还没运行完毕，我们就做空的死循坏
        while (thread.isAlive() || thread1.isAlive()) {

        }
        System.err.println("finish！");
    }
}
